<?php
/*
*  Класс обеспечивает работу с датами. Преобразование из формата, понятного человеку в формат БД и обратно
*/

/**
 * Класс для работы с датой и временем
 *
 *Чаще всего используются 2 функции:
 * getTimeForUser возвращает дату и время во временном поясе пользователя, нужно передавать время из бд
 * gLocalTime2BD возвращает настоящее время по гринфичу, для записи в бд
 */
class Service_Date {

	public static $timestampOneDayInterval = 86400;
	public static $gmtPlusShow = 4;
	/**
	 * Возвращает время по гринфичу, для записи в бд
	 *
	 * @param mixed $localstamp
	 * @return время по гринвичу
	 */
	public static function gLocalTime2BD($localstamp = false) {
		if ($localstamp === false) $localstamp = time();
		return gmdate("Y-m-d H:i:s", $localstamp);
	}
	
	/**
	 * Возвращает timestamp с учетом часового пояса
	 * 
	 * @return int - timestamp по гринвичу
	 */
	public static function gTime() {
		return strtotime(gmdate("Y-m-d H:i:s", time()));
	}
	
	/**
	 * Преобразовывает дату из массива в строку, пригодную для работы с БД
	 * 
	 * @param array $arrDate - массив с датой
	 * 
	 * @return string - дата в формате БД
	 */
	public static function dateToBDFromArr(array $arrDate) {
		return $arrDate['year'] . '-' . ($arrDate['mon'] < 10 ? '0' : '') . $arrDate['mon'] . '-' . ($arrDate['mday'] < 10 ? '0' : '') . $arrDate['mday'];
	}
	
	/**
	 * Возвращает стандартные дату и время пользователю со смещением относительно Гринвича
	 * 
	 * @return string - строка в формате d.m.y H:i
	 */
	public static function getStandardHumanDatetimeWithGmtPlus($dbDatetime) {
		return date('d.m.y H:i', strtotime($dbDatetime) + 3600 * self::$gmtPlusShow);
	}

	/**
	 * Возвращает время по гринфичу, для записи в бд
	 *
	 * @param mixed $localstamp
	 * @return время по гринфичу
	 */
	public static function date2BD() {
		return gmdate("Y-m-d", time());
	}
	
	public static function dateToBD($date){
		$arrDate = explode('/', $date);
		if (sizeof($arrDate) != 3) return '';
		return $arrDate[2] . '-' . $arrDate[1] . '-' . $arrDate[0];
	}

	public static function dateBDToHuman($date = null, $addTime = 0){
		if (empty($date)) $date = self::date2BD($addTime);
		$arrDate = explode('-', $date);
		if (sizeof($arrDate) != 3) return '';
		return $arrDate[2] . '/' . $arrDate[1] . '/' . $arrDate[0];
	}
	
	public static function dateToRus($date){
		$arrDate = explode('/', $date);
		if (sizeof($arrDate) != 3) return '';
		return intval($arrDate[0]) . ' ' . self::getMonth($arrDate[1]) . ' ' . (strlen($arrDate[2]) < 4 ? '20' : '') . $arrDate[2];
	}	
	
	public static function getMonth($month, $fullName = false, $case = 1) {
		$arrMothes = array('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');
		if ($fullName) $strMonth = $arrMothes[$month - 1];
		else $strMonth = Service_Function::utf8_substr($arrMothes[$month - 1], 0, 3);
		if ($case == 2 && $fullName) {
			$lastSymbol = Service_Function::utf8_substr($strMonth, - 1);
			if ($lastSymbol == 'ь' || $lastSymbol == 'й') $strMonth = Service_Function::utf8_substr($strMonth, 0, - 1) . 'я';
			else $strMonth .= 'а';	
		} 
		return $strMonth;
	}
	
	public static function getDayOfWeek($date) {
		$arrDate = explode('/', $date);
		if (sizeof($arrDate) != 3) return '';
		$date = mktime(0, 0, 0, $arrDate[1], $arrDate[0], $arrDate[2]);
		$arrDate = getdate($date);
		$weekDay = $arrDate['wday'];
		return self::getWeekDay($weekDay);
		///return intval($arrDate[0]) . ' ' . self::getMonth($arrDate[1]) . ' ' . $arrDate[2];		
	}
	
	public static function getWeekDay($weekDay) {
		$language = Service_Translate::getLang();
		switch ($weekDay) {
			case 1: return ($language == 'ru' ? 'Пн' : 'Mon');	break;
			case 2: return ($language == 'ru' ? 'Вт' : 'Tue');	break;
			case 3: return ($language == 'ru' ? 'Ср' : 'Wed');	break;
			case 4: return ($language == 'ru' ? 'Чт' : 'Thu');	break;
			case 5: return ($language == 'ru' ? 'Пт' : 'Fri');	break;
			case 6: return ($language == 'ru' ? 'Сб' : 'Sat');	break;
			case 0: return ($language == 'ru' ? 'Вс' : 'Sun');	break;
		}
	}	
	
	/**
	 * Получает timestamp
	 * 
	 * @param string $dbFormattedDate
	 */
	public static function getTimestamp($dbFormattedDate) {
		list($year, $month, $day) = explode('-', $dbFormattedDate);
		return mktime(0, 0, 0, (int) $month, (int) $day, (int) $year);
	}
	
	/**
	 * Разница между двумя датами
	 * 
	 * $interval can be:
   * yyyy - Number of full years
   * q - Number of full quarters
   * m - Number of full months
   * y - Difference between day numbers
   *     (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
   * d - Number of full days
   * w - Number of full weekdays
   * ww - Number of full weeks
   * h - Number of full hours
   * n - Number of full minutes
   * s - Number of full seconds (default)
   */
	public static function dateDiff($datefrom, $dateto, $interval, $using_timestamps = false) {
    if (!$using_timestamps) {
        $datefrom = strtotime($datefrom, 0);
        $dateto = strtotime($dateto, 0);
    }
    $difference = $dateto - $datefrom; // Difference in seconds
     
    switch($interval) {
     
    case 'yyyy': // Number of full years

        $years_difference = floor($difference / 31536000);
        if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
            $years_difference--;
        }
        if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
            $years_difference++;
        }
        $datediff = $years_difference;
        break;

    case "q": // Number of full quarters

        $quarters_difference = floor($difference / 8035200);
        $months_difference = 0;
        while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
            $months_difference++;
        }
        $quarters_difference--;
        $datediff = $quarters_difference;
        break;

    case "m": // Number of full months

        $months_difference = floor($difference / 2678400);
        while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
            $months_difference++;
        }
        $months_difference--;
        $datediff = $months_difference;
        break;

    case 'y': // Difference between day numbers

        $datediff = date("z", $dateto) - date("z", $datefrom);
        break;

    case "d": // Number of full days

        $datediff = floor($difference / 86400);
        break;

    case "w": // Number of full weekdays

        $days_difference = floor($difference / 86400);
        $weeks_difference = floor($days_difference / 7); // Complete weeks
        $first_day = date("w", $datefrom);
        $days_remainder = floor($days_difference % 7);
        $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
        if ($odd_days > 7) { // Sunday
            $days_remainder--;
        }
        if ($odd_days > 6) { // Saturday
            $days_remainder--;
        }
        $datediff = ($weeks_difference * 5) + $days_remainder;
        break;
    case "ww": // Number of full weeks
        $datediff = floor($difference / 604800);
        break;
    case "h": // Number of full hours
        $datediff = floor($difference / 3600);
        break;
    case "n": // Number of full minutes
        $datediff = floor($difference / 60);
        break;
    default: // Number of full seconds (default)
        $datediff = $difference;
        break;
    }    
    return $datediff;
	}
	
	/**
	 * Изменят формат даты
	 * 
	 * @param string $theDate - дата в формате $mask 
	 * @param string $mask - входная маска
	 * @param string $outputMask - выходная маска
	 */
	public static function changeDateFormat($theDate, $mask, $outputMask = 'U') {
		$maskOrig = $mask;
		if ($mask == 'U') $stamp = $theDate;
		$obj['seconds'] = null;
		$obj['minutes'] = null;
		$obj['hours'] = null;
		$obj['days'] = null;
		$obj['months'] = null;
		$obj['years'] = null;
		$obj['ampm'] = null;
		
		// define the valid values that we will use to check
		// value => length
		$all = array (

		//time
		's' => 'ss', // Seconds, with leading zeros
		'i' => 'ii', // Minutes with leading zeros
		'H' => 'HH', // 24-hour format of an hour with leading zeros
		'h' => 'hh', // 12-hour format of an hour with leading zeros
		'G' => 'GG', // 24-hour format of an hour without leading zeros
		'g' => 'gg', // 12-hour format of an hour without leading zeros
		'A' => 'AA', // Uppercase Ante meridiem and Post meridiem
		'a' => 'aa', // Lowercase Ante meridiem and Post meridiem

		//year
		'y' => 'yy', // A full numeric representation of a year, 4 digits
		'Y' => 'YYYY', // A two digit representation of a year

		//month
		'm' => 'mm', // A numeric representation of a month with leading zeros.
		'M' => 'MMM', // A textual representation of a month.  3 letters.  ex: Jan, Feb, Mar, Apr...
		'n' => 'nn', // Numeric representation of a month, without leading zeros

		//days
		'd' => 'dd', // Day of the month, 2 digits with leading zeros
		'j' => 'jj', // Day of the month without leading zeros
		'S' => 'SS', // English ordinal suffix for the day of the month, 2 characters (st, nd, rd, or th. works well with j)
		'D' => 'DDD' );// Textual representation of day of the week (Sun, Mon, Tue, Wed)
		
		// this will give us a mask with full length fields
		$mask = str_replace(array_keys($all), $all, $mask);
		$vals = array ();
		//loop through each character of $mask starting at the beginning
		for($i = 0; $i < strlen($maskOrig); $i++) {
			//get the current character
			$thisChar = substr($maskOrig, $i, 1);
			//if the character is not in the $all array, skip it
			if (array_key_exists($thisChar, $all)) {
				$type = $thisChar;
				$chars = $all[$type];
				// get position of the current char
				if (($pos = strpos($mask, $chars)) === false) continue;
				// find the value from $theDate
				$val = substr($theDate, $pos, strlen($chars));
				/*		START FIX FOR UNITS WITHOUT LEADING ZEROS		*/
				if ($type == "n" || $type == "j" || $type == "g" || $type == "G") {
					//if its not numeric, try a shorter digit
					if (!is_numeric($val)) {
						$val = substr($theDate, $pos, strlen($chars) - 1);
						$mask = str_replace($chars, $type, $mask);
					}
					else {
						//try numeric value checking
						switch ($type) {
							case "n":
								if ($val > 12 || $val < 1) { //month must be between 1-12
									$val = substr($theDate, $pos, strlen($chars) - 1);
									$mask = str_replace($chars, $type, $mask);
								}
								break;
							case "j":
								if ($val > 31 || $val < 1) { //day must be between 1-31
									$val = substr($theDate, $pos, strlen($chars) - 1);
									$mask = str_replace($chars, $type, $mask);
								}
								break;
							case "g":
								if ($val > 12 || $val < 1) { //day must be between 1-12
									$val = substr($theDate, $pos, strlen($chars) - 1);
									$mask = str_replace($chars, $type, $mask);
								}
								break;
							case "G":
								if ($val > 24 || $val < 1) { //day must be between 1-24
									$val = substr($theDate, $pos, strlen($chars) - 1);
									$mask = str_replace($chars, $type, $mask);
								}
								break;
						}
					}
				}
				/*		END FIX FOR UNITS WITHOUT LEADING ZEROS		*/
				//save this value
				$vals [$type] = $val;
			}
		}
		foreach ( $vals as $type => $val ) {
			switch ($type) {
				case 's': $obj['seconds'] = $val; break;
				case 'i': $obj['minutes'] = $val; break;
				case 'H': case 'h': $obj['hours'] = $val; break;
				case 'A':	case 'a':	$obj['ampm'] = $val; break;
				case 'y': $obj['years'] = (($val < 30) ? '20' : '19') . $val;	break;
				case 'Y':	$obj['years'] = $val;	break;
				case 'm':	$obj['months'] = $val; break;
				case 'M':	$obj['months'] = self::monthNum($val, true); break;
				case 'R':	$obj['months'] = self::monthNum($val, true); break;
				case 'd':	$obj['days'] = $val; break;
				//ones without leading zeros:
				case 'n':	$obj['months'] = $val; break;
				case 'j':	$obj['days'] = $val; break;
				case 'g': $obj['hours'] = $val;	break;
				case 'G':	$obj['hours'] = $val;	break;
			}
		}

			//if its pm, add 12 hours
		if (strtolower($obj['ampm']) == "pm") $obj['hours'] = $obj['hours'] + 12;
		if (empty($stamp)) $stamp = mktime(( int ) $obj['hours'], ( int ) $obj['minutes'], ( int ) $obj['seconds'], ( int ) $obj['months'], ( int ) $obj['days'], ( int ) $obj['years']);
		$arrOutputMask = str_split($outputMask);
		if (in_array('R', $arrOutputMask)) { // Если есть русский длинный месяц
			$outputMask = str_replace('R', self::getMonth($obj['months'], true, 2), $outputMask);
		}
		if (in_array('r', $arrOutputMask)) { // Если есть русский короткий месяц
			$outputMask = str_replace('r', self::getMonth($obj['months'], false, 2), $outputMask);
		}
		return date($outputMask, $stamp);
	}
	
	public static function monthNum($theMonth, $twoDigit=false) {
		switch (strtolower($theMonth)) {
			case 'jan':
			case 'jan.';
			case 'january':
			case 1:
				return ($twoDigit == true ? '01': '1');
				break;
			case 'feb':
			case 'feb.':
			case 'february':
			case 'febuary':
			case 2:
				return ($twoDigit == true ? '02': '2');
				break;
			case 'mar':
			case 'mar.':
			case 'march':
			case 3:
				return ($twoDigit == true ? '03': '3');
				break;
			case 'apr':
			case 'apr.':
			case 'april':
			case 4:
				return ($twoDigit == true ? '04': '4');
				break;
			case 'may':
			case 'may.':
			case 5:
				return ($twoDigit == true ? '05': '5');
				break;
			case 'jun':
			case 'jun.':
			case 'june':
			case 6:
				return ($twoDigit == true ? '06': '6');
				break;
			case 'jul':
			case 'jul.':
			case 'july':
			case 7:
				return ($twoDigit == true ? '07': '7');
				break;
			case 'aug':
			case 'aug.':
			case 'august':
			case 8:
				return ($twoDigit == true ? '08': '8');
				break;
			case 'sep':
			case 'sep.':
			case 'sept':
			case 'sept.':
			case 'september':
			case 9:
				return ($twoDigit == true ? '09': '9');
				break;
			case 'oct':
			case 'oct.':
			case 'october':
			case 10:
				return '10';
				break;
			case 'nov':
			case 'nov.':
			case 'november':
			case 11:
				return '11';
				break;
			case 'dec':
			case 'dec.':
			case 'december':
			case 12:
				return '12';
				break;
			default:
				return $theMonth;
				break;
		}
	}

	/**
	 * Возвращает дату с месяцем в виде текста
	 * 
	 * @param string $date - Дата в формате 17/12/2012
	 * @param bool $fullNames - Нужны ли длиные названия месяцев
	 * @param bool $year - Нужен ли год
	 * @return boolean|string
	 */
	public static function getRusDate($date, $fullNames = true, $year = false) {
		if (empty($date)) return false;
		if (Service_Translate::getLang() == 'ru') {
			if ($fullNames) return self::changeDateFormat($date, 'd/m/Y', 'd R' . ($year ? ' Y' : ''));
			else return self::changeDateFormat($date, 'd/m/Y', 'd r' . ($year ? ' Y' : ''));
		}
		else {
			if ($fullNames) return self::changeDateFormat($date, 'd/m/Y', 'F d' . ($year ? ' Y' : ''));
			else return self::changeDateFormat($date, 'd/m/Y', 'M d' . ($year ? ' Y' : ''));
		}
		
	}


	// Пример обработки дат для PHP 5.3
  //$objDateTime = DateTime::createFromFormat($format , $strDate);
  //echo date_format($objDateTime, $format2);
  
  /**
   * Функция возвращает дату и время
   *
   * @param str $date
   * @param int $timeZone
   * @return дату и время
   */
  public static function getTimeForUser($date, $timeZone = 4) {
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date) + 3600 * Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);
		
		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));


		if ($arrNow['year'] == $arrDate['year'] && $arrNow['mon'] == $arrDate['mon']) {
         switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = Service_Translate::getText('Сегодня');
          break;
          case 1:
            $convDate = Service_Translate::getText('Вчера');
          break;
          case 2:
            $convDate = Service_Translate::getText('2 дня назад');
          break;
          case 3:
            $convDate = Service_Translate::getText('3 дня назад');
          break;
          default:
            $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']);
          break;
			}
			$convDate .= ' ' . Service_Translate::getText('в') . ' ' . $convTime;
		}
  	else {
  		$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'] . " г.";
  	}
  	return $convDate;
  }

  
  /**
   * Возращает время в зависимости от часового пояса
   * @param int $date
   * @param int $timeZone
   * @return дату и время
   */
  public static function getTimeForZone($date, $timeZone = 4) {
  	$convDate="";
  	$convTime="";
  	$date = date('Y-m-d H:i:s', strtotime($date)+3600*Service_Date::summerTime($timeZone));
  	return $date;
  }
  
  /**
   * Возвращает время временную зону ичитывая летнее и зимнее время
   *
   * @param int $timeZone
   * @return unknown
   */
	public static function summerTime($timeZone) {
    /*static $newTimeZone;
    if (!isset($newTimeZone)) {*/
      $arrTime = localtime(time(),true);
      if ($arrTime['tm_isdst'] == 1) $newTimeZone = $timeZone - 1;
      else $newTimeZone = $timeZone;
    //}
    return $newTimeZone;
  }
  
  /**
   * Функция возвращает название месяца
   *
   * @param int $monthNumber - Номер месяца
   *
   * @return string - название месяца
   */
  public static function getMonthName($monthNumber) {
  	switch ($monthNumber) {
  		case 01:case 1: return "январь";
  		case 02:case 2: return "февраль";
  		case 03:case 3: return "март";
  		case 04:case 4: return "апрель";
  		case 05:case 5: return "май";
  		case 06:case 6: return "июнь";
  		case 07:case 7: return "июль";
  		case 08:case 8: return "август";
  		case 09:case 9: return "сентябрь";
  		case 10: return "октябрь";
  		case 11: return "ноябрь";
  		case 12: return "декабрь";
  		default:return null;
  	}
  }

  /**
   * Функция возвращает название месяца в родительном падеже
   * 
   * @param int $monthNumber - Номер месяца
   * 
   * @return string - название месяца
   */
	public static function getMonthNameR($monthNumber) {
		$language = Service_Translate::getLang();
		if ($language == 'en') return date('F', mktime(0, 0, 0, $monthNumber));
    switch ($monthNumber) {
    	case 01:case 1: return "января";
    	case 02:case 2: return "февраля";
    	case 03:case 3: return "марта";
    	case 04:case 4: return "апреля";
    	case 05:case 5: return "мая";
    	case 06:case 6: return "июня";
    	case 07:case 7: return "июля";
    	case 08:case 8: return "августа";
    	case 09:case 9: return "сентября";
    	case 10: return "октября";
    	case 11: return "ноября";
    	case 12: return "декабря";
    	default:return NULL;
    }
  } 

  /**
   * Функция возвращает название месяца в предложном падеже
   * @param int $monthNumber
   * @return string - название месяца
   */
  public static function getMonthNamePrepositional($monthNumber) {
  	$language = Service_Translate::getLang();
  	if ($language == 'en') return date('F', mktime(0, 0, 0, $monthNumber));
  	switch ($monthNumber) {
  		case 01:case 1: return "январе";
  		case 02:case 2: return "феврале";
  		case 03:case 3: return "марте";
  		case 04:case 4: return "апреле";
  		case 05:case 5: return "мае";
  		case 06:case 6: return "июне";
  		case 07:case 7: return "июле";
  		case 08:case 8: return "августе";
  		case 09:case 9: return "сентябре";
  		case 10: return "октябре";
  		case 11: return "ноябре";
  		case 12: return "декабре";
  		default:return NULL;
  	}
  }
  
  /**
   * Метод возращает период отчета
   * @param string $yearWithMonth - год и месяц отчета
   * @return array $arrPeriod
   */
  public static function getOrderPeriod($yearWithMonth) {
  	$arrPeriod = array();
  	$yearMonth = substr($yearWithMonth, 0, 4) . '-' . substr($yearWithMonth, 4);
  	$arrPeriod['period_start'] = $yearMonth . '-01';
  	$arrPeriod['period_end'] = date('Y-m-t',Service_Date::getTimestamp($arrPeriod['period_start']));
  	return $arrPeriod;
  }
  
  /**
   * Возвращает дату в виде "23 ноября"
   * 
   * @param string $date - Дата вида "2012-11-23"
   * @return string
   */
  public static function getDateWithMonth($date) {
    	$arrDate = explode('-', $date);
  	return $arrDate[2] . ' ' . self::getMonthNameR($arrDate[1]);
  }
  
  /**
   * Метод период приживания в отеле в виде (Например, июнь-июль 2012)
   * @param string $dateArr - дата заездаы
   * @param string $dateDep - дата отъезда
   * @return string - дата в нужном формате
   */
  public static function getDuringPeriod($dateArr, $dateDep, $is_prepositional = false) {
  	$dateArrM = self::changeDateFormat($dateArr, 'Y-m-d', 'm');
  	$dateDepM = self::changeDateFormat($dateDep, 'Y-m-d', 'm');
  	$dateArrY = self::changeDateFormat($dateArr, 'Y-m-d', 'Y');
  	$dateDepY = self::changeDateFormat($dateDep, 'Y-m-d', 'Y');
  	$mounth = ($is_prepositional ? self::getMonthNamePrepositional($dateArrM) : self::getMonth($dateArrM, true));
  	$year = $dateArrY;
  	
  	if ($dateArrM != $dateDepM) $mounth .= '-' . ($is_prepositional ? self::getMonthNamePrepositional($dateDepM) : self::getMonth($dateDepM, true));
  	if ($dateArrY != $dateDepY) $year .= '-' .$dateDepY;
  	
  	return $mounth . ' ' . $year;
  }
  
  /**
   * Возвращаем флаг является ли дата устаревшей с учетом часового пояса
   * @param string $date - Дата в формате 22/07/13
   * @param int $date - Максимально допустимое смещение от времени сервера в часах
   * @return boolean
   */
  public static function checkOldDate($date, $diff = 12) {
  	return (Service_Date::changeDateFormat($date . ' 23:59:59', 'd/m/Y H:i:s') < Service_Date::changeDateFormat(date('d/m/Y H:i:s'), 'd/m/Y H:i:s') - $diff * 3600);
  }
  
  /**
   * Определяем прошла ли уже дата
   * 
   * @param string $date - Дата
   * @return bool
   */
  public static function isDateInPast($date) {
  	$objDate = new DateTime($date);
  	$objNowDate = new DateTime();
  	$refundableDate = $objDate->format('Y-m-d H:i:s O');
  	$objInterval = date_diff($objNowDate, $objDate);
  	return $objInterval->invert;
  }
  
  /**
   * Возвращаем сегодняшнюю дату по гринвичу
   */
  public static function getToday() {
  	return Service_Date::changeDateFormat(time() - Service_Date::$gmtPlusShow * 3600, 'U', 'Y-m-d');
  }
  
  public static function clampYear($date, $compareDate = null) {
  	
  	$objDate = new DateTime($date);
  	$objNowDate = new DateTime();
  	$objInterval = date_diff($objNowDate, $objDate);
  	if($objInterval->invert) {
  		$objDate->add(new DateInterval('P1Y'));
  	}
  	return $objDate->format('Y-m-d');
  }
}
?>